<?php if (!defined('BASEPATH'))exit('No direct script access allowed');

include_once 'main.php';

/**
 * Controller para ações de email
 * 
 * @author Douglas Rafael
 * @package controllers     
 */
class Email extends Main {

    public function __construct() {
        parent::__construct();
        //Verifica se o usuário estar logado no sistema
        $this->verificaLogado();
        
        // carrega class nescessárias
        $this->load->model('DAOEmail');
        $this->load->helper('text');

        // Carregando js nescessários
        $arr_js = $this->config->item('js');
        array_push($arr_js, '../plugins/ckeditor/ckeditor');
        $this->template->load_js($arr_js);
        
        //Seta propriedades do template
        $this->template->set('title', 'Cadastro e Envio de E-Mail || ' . $this->title);
        $this->template->set('page_title', 'Cadastro e Envio de E-Mail');
        $this->template->set('page_infor', '<h2 class="title-infor">informações gerais</h2>
                        <p class="bold">Ao clicar em CADASTRAR, o e-mail é salvo, mas não enviado. Para enviar clique em ENVIAR.</p>
                        <p class="bold"><span class="bold">ALT + N</span> Abre o formulário para cadastrar um novo E-Mail.</p>
                        <p><span class="bold">ESC</span> Fecha o formulário.</p>
                        <p><span class="bold">Duplo clique</span> sobre o registro, abre formulário para edição dos dados.</p>');
    }

    public function index() {
        $this->listar();
    }

    /**
     * Carrega a view com a lista de autores
     */
    public function listar() {
        try {
            $this->verificaPermissao(ControleAcesso::CONSULTAR_EMAIL);
            // Removendo a variavel 'searchterm' da sessão
            $this->session->unset_userdata('searchterm');

            $init = ($this->uri->segment(6)) ? $this->uri->segment(6) : 0;
            $this->treat_orderby();

            $total_pagina = $this->uri->segment(5) ? $this->uri->segment(5) : 10;
            $autores = $this->DAOEmail->select_all_emails($init, $total_pagina, $this->order_by, $this->direction);
            $total_rows = $this->DAOEmail->amount_all_emails();

            // paginação
            $config['uri_segment'] = 6;
            $config['base_url'] = base_url() . "email/listar/" . $this->order_by_name . '/'. $this->direction_name . '/' .$total_pagina;
            $config['total_rows'] = $total_rows;
            $config['per_page'] = $total_pagina;
            $this->pagination->initialize($config);

            //data
            $data['total_rows'] = $this->treat_number_rows($total_rows);
            $data['pagination'] = $this->pagination->create_links();
            $data['emails'] = $autores;
            $data['quant_list'] = $total_pagina;
            $data['path_img_user'] = $this->config->item('path_img_user');

            $this->template->load(NULL, 'email_list', $data, FALSE, TRUE);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_autor();
        }
    }

    /**
     * Retorna via json o email selecionado
     */
    public function get_email_json() {
        try {
            $this->load->library('form_validation');
            $this->form_validation->set_rules("idEmail", "Código", "trim|required|is_natural|exact_lenght[6]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                echo validation_errors();
            } else {
                $email = new TOEmail();
                $email->id = $this->input->post('idEmail', TRUE);

                $data['email'] = $this->DAOEmail->get_email($email);
                echo json_encode($data);
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_autor();
        }
    }

    /**
     * Cadastra/Salva Email
     * 
     * @param  bool $send   Envia o e-mail caso senja TRUE. 
     * @throws ExceptionValidacao
     */
    public function cadastrar($send = FALSE) {
        try {
            $this->verificaPermissao(ControleAcesso::CADASTRAR_EMAIL);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("todos", "Todos usuários", "trim|exact_length[1]|xss_clean");
            $this->form_validation->set_rules("assunto", "Assunto", "trim|required|min_length[5]|xss_clean");
            $this->form_validation->set_rules("mensagem", "Mensagem", "trim|required|min_length[2]");
            $todos = $this->input->post('todos', TRUE);
            if(!$todos){
                $this->form_validation->set_rules("email_destinatario", "Destinatário(s)", "trim|required|min_length[4]");
            }
            
            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $email = new TOEmail();
                $email->destinatario = $this->input->post('email_destinatario');
                $email->assunto = $this->input->post('assunto', TRUE);
                $email->mensagem = $this->input->post('mensagem');
                $email->data_cadastro = date('Y-m-d H:i:s');
                $email->usuario = new TOUsuario();
                $email->usuario->id = Main::get_user_logged();
                
                /**
                 * Tratando o destinatário
                 */
                if ($todos) { // Verifica se foi solicitado o envio para todos os usuários
                    $this->load->model('DAOUsuario');
                    $destinatarios = $this->DAOUsuario->get_emails_user(); // Array contendo e-mails de todos usuários cadastrados
                } else {
                    $destinatarios = explode(',', $email->destinatario);
                }

                // validando e-mails, e removendo os que não forem e-mail
                foreach ($destinatarios as $key => $email_vez) {
                    if (!filter_var(trim($email_vez), FILTER_VALIDATE_EMAIL))
                        unset($destinatarios[$key]);
                    else
                        $destinatarios[$key] = trim($email_vez); // remove possíveis espaços em branco
                }       
                
                // Remove duplicados caso exista
                $list_destinatarios = array_unique($destinatarios);
                // END Tratando o destinatário
                
                // Se for solicitado o envio
                if ($send) {
                    $email->data_envio = $email->data_cadastro;
                    $email->status = TOEmail::EMAIL_ENVIADO;

                    // Envia o e-mail para os destinatários caso o módulo estiver habilitado
                    if (!$this->session->userdata('modulo_email_status')) {
                        // Envia e-mail uma de cada vez para os destinatários informados
                        foreach ($list_destinatarios as $value) {
                            $email->destinatario = $value;
                            $this->DAOEmail->send_email($email);
                        }
                        $menssage = "E-Mail: <span class='bold'>{$email->assunto}</span> ENVIADO e cadastrado com sucesso!";
                    } else {
                        throw new ExceptionValidacao("<span class='bold'>O módulo de e-mail está DESATIVADO! Portanto não é possível enviar qualquer tipo de e-mail.</span><p>Caso possua permissão, vá em configurações e habilite o módulo.</p>");
                    }
                } else {
                    $email->data_envio = NULL;
                    $email->status = TOEmail::EMAIL_NAO_ENVIADO;
                    $menssage = "E-Mail: <span class='bold'>{$email->assunto}</span> cadastrado com sucesso!";
                }

                // Separa por vírgula os destinatarios para salvar no banco
                $email->destinatario = implode(', ', $list_destinatarios);
                
                // Salva o e-mail no banco
                $this->DAOEmail->insert_email($email);
                
                Mensagem::setMensagemSucesso($menssage);

                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }
    
    /**
     * Atualiza dados do e-mail ou envia
     * 
     * @throws ExceptionValidacao
     */
    public function atualizar($send = FALSE) {
        try {
            $this->verificaPermissao(ControleAcesso::ATUALIZAR_EMAIL);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("codigo", "Código", "trim|required|is_natural|exact_lenght[6]|xss_clean");
            $this->form_validation->set_rules("todos", "Todos usuários", "trim|exact_length[1]|xss_clean");
            $this->form_validation->set_rules("assunto", "Assunto", "trim|required|min_length[5]|xss_clean");
            $this->form_validation->set_rules("mensagem", "Mensagem", "trim|required|min_length[2]");
            $todos = $this->input->post('todos', TRUE);
            if (!$todos) {
                $this->form_validation->set_rules("email_destinatario", "Destinatário(s)", "trim|required|min_length[4]");
            }

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $email = new TOEmail();
                $email->id = $this->input->post('codigo');
                $email->destinatario = $this->input->post('email_destinatario');
                $email->assunto = $this->input->post('assunto', TRUE);
                $email->mensagem = $this->input->post('mensagem');

                /**
                 * Tratando o destinatário
                 */
                if ($todos) { // Verifica se foi solicitado o envio para todos os usuários
                    $this->load->model('DAOUsuario');
                    $destinatarios = $this->DAOUsuario->get_emails_user(); // Array contendo e-mails de todos usuários cadastrados
                } else {
                    $destinatarios = explode(',', $email->destinatario);
                }
                
                // validando e-mails, e removendo os que não forem e-mail
                foreach ($destinatarios as $key => $email_vez) {
                    if (!filter_var(trim($email_vez), FILTER_VALIDATE_EMAIL))
                        unset($destinatarios[$key]);
                    else
                        $destinatarios[$key] = trim($email_vez); // remove possíveis espaços em branco
                }       
                
                // Remove duplicados caso exista
                $list_destinatarios = array_unique($destinatarios);
                // END Tratando o destinatário
                
                // Se for solicitado o envio
                if ($send) {
                    $email->data_envio = date('Y-m-d H:i:s');
                    $email->status = TOEmail::EMAIL_ENVIADO;

                    // Envia o e-mail para os destinatários caso o módulo estiver habilitado
                    if (!$this->session->userdata('modulo_email_status')) {
                        // Envia e-mail uma de cada vez para os destinatários informados
                        foreach ($list_destinatarios as $value) {
                            $email->destinatario = $value;
                            $this->DAOEmail->send_email($email);
                        }
                        $menssage = "E-Mail: <span class='bold'>{$email->assunto}</span> ENVIADO e cadastrado com sucesso!";
                    } else {
                        throw new ExceptionValidacao("<span class='bold'>O módulo de e-mail está DESATIVADO! Portanto não é possível enviar qualquer tipo de e-mail.</span><p>Caso possua permissão, vá em configurações e habilite o módulo.</p>");
                    }
                } else {
                    $email->data_envio = NULL;
                    $email->status = TOEmail::EMAIL_NAO_ENVIADO;
                    $menssage = "E-Mail: <span class='bold'>{$email->assunto}</span> cadastrado com sucesso!";
                }

                // Separa por vírgula os destinatarios para salvar no banco
                $email->destinatario = implode(', ', $list_destinatarios);

                // Salva o e-mail no banco
                $this->DAOEmail->update_email($email);

                Mensagem::setMensagemSucesso($menssage);

                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }

    /**
     * Exclui autor
     */
    public function excluir() {
        try {
            $this->verificaPermissao(ControleAcesso::EXCLUIR_EMAIL);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("codigoDelete", "Código", "trim|required|xss_clean");
            $this->form_validation->set_rules("nomeDelete", "Nome", "trim|min_length[5]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $email = new TOEmail();
                $email->id = explode(',', $this->input->post('codigoDelete', TRUE)); // Monta array com os ids 
                $email->assunto = $this->input->post('nomeDelete', TRUE);
                
                $this->DAOEmail->delete_email($email);

                $email->assunto != NULL ? Mensagem::setMensagemSucesso("E-Mail: <span class='bold'>" . $email->assunto . "</span> excluído com sucesso.") : Mensagem::setMensagemSucesso("E-Mails  excluídos com sucesso!");

                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }

    /**
     * Busca autor
     */
    public function buscar() {
        try {
            $searchterm = $this->searchtermHandler($this->input->get_post('search_term', TRUE));
            $init = ($this->uri->segment(6)) ? $this->uri->segment(6) : 0;
            $this->treat_orderby();

            $total_pagina = $this->uri->segment(5) ? $this->uri->segment(5) : 10;
            $autores = $this->DAOEmail->search_email($init, $total_pagina, $searchterm, $this->order_by, $this->direction);
            $total_rows = $this->DAOEmail->amount_search_email($searchterm);

            //paginação
            $config['uri_segment'] = 6;
            $config['per_page'] = $total_pagina;
            $config['base_url'] = base_url() . "email/buscar/" . $this->order_by_name . "/" . $this->direction_name . '/' .$total_pagina;
            $config['total_rows'] = $total_rows;
            $this->pagination->initialize($config);

            //data
            $data['total_rows'] = $this->treat_number_rows($total_rows);
            $data['pagination'] = $this->pagination->create_links();
            $data['emails'] = $autores;
            $data['quant_list'] = $total_pagina;
            $data['path_img_user'] = $this->config->item('path_img_user');

            if ($total_rows == 0)
                Mensagem::setMensagem("Nenhum registro foi encontrado para essa pesquisa: <span class='bold'> $searchterm </span>", "aviso");

            $this->template->load(NULL, 'email_list', $data, FALSE, TRUE);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->listar();
        }
    }
    
    /**
     * Função para selciocionar autor no auto_complete
     */
    public function auto_complete_author() {
        $autor = new TOAutor();
        $autor->nome = $this->input->get('term', TRUE);

        echo json_encode($this->DAOAutor->suggestion_author($autor));
    }

    private function view_list_autor() {
        $this->template->load(NULL, 'autor_list');
    }

}
